Many software services generate logs that record data (e.g., events, transactions, messages, errors, etc.) pertaining to their runtime operation. In a business setting, ensuring the integrity of such logs—in other words, preventing and/or detecting modifications to the logs after they are generated—can be of key importance for security analysis, regulatory compliance, and other reasons. For example, consider a scenario where an attacker compromises a server owned by an organization and the attack is not detected until some period of time later. In this case, retroactively analyzing the server's logs can, in theory, provide useful information regarding how the attack was perpetrated and the scope of the security breach. However, if the logs are not secured against tampering, the attacker can alter the logged data at the time of the attack in order to cover his/her tracks, thereby rendering the analysis invalid.
Cryptography can be a useful tool for implementing log integrity, but existing cryptographic solutions are difficult to apply to distributed software services (i.e., software services comprising multiple, separate service instances). This is because such existing solutions generally require some degree of state synchronization and state persistence across the service instances in order to keep track of common cryptographic keys and/or other security metadata. The need for state persistence also means that these existing cryptographic solutions are not robust in the face of server/network failures or service management operations (e.g., software/hardware upgrades) that may cause one or more service instances to stop and restart.
Beyond cryptography, there are other mechanisms that may be useful for promoting log integrity, such as physical or software-based access controls implemented within an organization's infrastructure. However, these other mechanisms are generally less secure than crypto-based solutions and can be difficult for third parties to audit and verify.